#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <assert.h>     

#include "Terrain.h"


void terInit(Terrain *pTer, const char * nom_fichier)
{

	FILE* f; 
	int x, y, dimx, dimy;
	char val;
	
    	f = fopen(nom_fichier, "r");
    	if (f==NULL)
	{
        	printf("Erreur lors de l'ouverture du fichier: %s",nom_fichier);
       		assert( f );
    	}
	
	assert( fscanf( f , "#dimx:%d\n", &dimx) !=-1);
	assert( fscanf( f , "#dimy:%d\n", &dimy) !=-1 );
	
 
       	pTer->dimX = dimx;
	pTer->dimY = dimy;


		pTer->tab = (char **)malloc(sizeof(char *)*pTer->dimY);
		assert(pTer!=NULL);
		/*!< reserver ds le tas pr le terrain*/
		for (y=0; y<pTer->dimY; y++)
		{
			pTer->tab[y] =(char *)malloc(sizeof(char)*pTer->dimX);
			assert(pTer->tab[y]!=NULL);
		}
		/*!<remplir le terrain avec le contenu du fichier du niveau correspondant */
		for(y=0;y<pTer->dimY;++y)
		{
			for(x=0;x<pTer->dimX;++x)
			{
				assert( fscanf( f , "%c", &val) ==1 );
				pTer->tab[y][x] = val;
			}
			do fscanf(f,"%c",&val); while (val!='\n');
		}
	
	fclose(f);
}

void terLibere(Terrain *pTer)
{
	int y;
	
	for (y=0; y<pTer->dimY; y++)
		free(pTer->tab[y]);
	free(pTer->tab);
	
	pTer->dimX = 0;
	pTer->dimY = 0;
	pTer->tab = NULL;
}

int  terEstPositionSokoValide(const Terrain * pTer, const int x, const int y)
{
	if (x>=0 && x<pTer->dimX && y>=0 && y<pTer->dimY && pTer->tab[y][x]!='#')
		return 1;
	else
		return 0;
}

int terEstPositionCaisseValide(const Terrain *pTer, const int x, const int y)
{
	if (x>=0 && x<pTer->dimX && y>=0 && y<pTer->dimY && pTer->tab[y][x]!='#' )
		return 1;
	else
		return 0;
}

const char  terGetXY(const Terrain *pTer,  int x, int y)
{
	assert( x>=0)  ;
	assert( y>=0) ;
	assert( x<pTer->dimX ) ;
	assert( y<pTer->dimY ) ;
	return pTer->tab[y][x];
}

void terSetXY(const Terrain *pTer, const int x, const int y, const char val)
{
	assert( x>=0) ;
	assert( y>=0) ;
	assert( x<pTer->dimX ) ;
	assert( y<pTer->dimY ) ;
	pTer->tab[y][x] = val;
}

const int getDimX(const Terrain *pTer)
{
	return pTer->dimX;
}

const int getDimY(const Terrain *pTer)
{
	return pTer->dimY;
}
 
void terTestRegression()
{
	Terrain ter;
	
	int ok_position_valide,dimX,dimY;	
	char  val_terrain_xy, nom_fichier[]="data/niveau/niveau1.txt";;
	
	/*on initialise le terrain à l'aide du niveau*/
	terInit(&ter, nom_fichier);
	
	/*!<On verifie si la position du sokoban est valide*/
	ok_position_valide=terEstPositionSokoValide(&ter, 6, 11);
	/*!<on verifie egalement si la fonction retourne le resultat attendu*/
	assert(ok_position_valide!=0);
	/*!<on recupere l'element se trouvant a la position x,y du terrain qui est un caractere*/
	val_terrain_xy=terGetXY(&ter,6, 11);
	
	/*!< on modifie l'element se trouvant a la position (x,y) du terrain pour mettre une caisse a la place ('*')*/
	terSetXY(&ter, 11, 5, '.');
	/*printf("%c\n",ter.tab[11][5]);*/
	assert(ter.tab[11][5]=='*');
	
	/*!< on recupere les  dimensions en x,y du terrain, puis on les verifie*/
	dimX=getDimY(&ter);
	dimY=getDimY(&ter);
	assert(dimX>0 && dimY>0);
	
	/*!< on libere l'emplacement occupe par le terrain*/
	terLibere(&ter);
  
}
